/*
分类讨论：
    k==1
        此时一定有一个是只能选边界的
        加上非边界的一个
        贪心取最大
    else
        第一轮选k个元素染色
        把当前蓝色相邻的红色染色
        成本为前k个红色+最后一个红色
*/
#include <cstdio> 
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
inline void read(T& x)
{
    int c=getchar(), f=1; x=0;
    while(c<'0'||'9'<c) {if(c=='-') f=-1; c=getchar();}
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    x*=f;
}

inline void write(long long x)
{
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}
#define DEBUG
using ll=long long;
const int N=5010;
int n, k;
int a[N];
ll ans;

void init()
{
    ans=0;
    read(n); read(k);
    for(int i=1; i<=n; i++) read(a[i]);
}   


void solve()
{  
    init();
    if(k>1)
    {
        sort(a+1, a+n+1, greater<int>());
        for(int i=1; i<=k+1; i++) ans+=1ll*a[i];
    }
    else
    {
        int l=*max_element(a+1, a+n);
        int r=*max_element(a+2, a+n+1);
        // printf("%d+%d %d+%d\n", l, a[n], r, a[1]);
        ans=max(l+a[n], r+a[1]);
    }
    write(ans); puts("");
    // printf("%lld\n", ans);
}

// #undef DEBUG
signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif

    int T=1; scanf("%d", &T);
    while(T--) 
    {
        solve();
    }
    return 0;
}